#!/usr/bin/perl

# gitolite VREF to check if all *new* commits have author == pusher

#                       THIS IS NOT READY TO USE AS IS
#                       ------------------------------
#           you MUST change the 'email_ok()' sub to suit *YOUR* site's
#           gitolite username -> author email mapping!

# See bottom of the program for important philosophical notes.

use strict;
use warnings;

# mapping between gitolite userid and correct email address is encapsulated in
# this subroutine; change as you like
sub email_ok {
    my ($author_email) = shift;
    my $expected_email = "$ENV{GL_USER}\@atc.tcs.com";
    return $author_email eq $expected_email;
}

my ( $ref, $old, $new ) = @ARGV;
for my $rev (`git log --format="%ae\t%h\t%s" $new --not --all`) {
    chomp($rev);
    my ( $author_email, $hash, $subject ) = split /\t/, $rev;

    # again, we use the trick that a vref can just choose to die instead of
    # passing back a vref, having it checked, etc., if it's more convenient
    die "$ENV{GL_USER}, you can't push $hash authored by $author_email\n" . "\t(subject of commit was $subject)\n"
      unless email_ok($author_email);
}

exit 0;

__END__

The following discussion is for people who want to enforce this check on ALL
their developers (i.e., not just the newbies).

Doing this breaks the "D" in "DVCS", forcing all your developers to work to a
centralised model as far as pushes are concerned.  It prevents amending
someone else's commit and pushing (this includes rebasing, cherry-picking, and
so on, which are all impossible now).  It also makes *any* off-line
collabaration between two developers useless, because neither of them can push
the result to the server.

PHBs should note that validating the committer ID is NOT the same as reviewing
the code and running QA/tests on it.  If you're not reviewing/QA-ing the code,
it's probably worthless anyway.  Conversely, if you *are* going to review the
code and run QA/tests anyway, then you don't really need to validate the
author email!

In a DVCS, if you *pushed* a series of commits, you have -- in some sense --
signed off on them.  The most formal way to "sign" a series is to tack on and
push a gpg-signed tag, although most people don't go that far.  Gitolite's log
files are designed to preserve that accountability to *some* extent, though;
see contrib/adc/who-pushed for an admin defined command that quickly and
easily tells you who *pushed* a particular commit.

Anyway, the point is that the only purpose of this script is to

  * pander to someone who still has not grokked *D*VCS
          OR
  * tick off an item in some stupid PHB's checklist

